home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / docs / ippon / xsp200_2 / xsp200_2.lzh / PCG90 / PCG90.s < prev   
Text File  |  1995-11-15  |  5KB  |  302 lines

  1.  
  2.     .globl        _pcg_roll90
  3.     .globl        _bgpcg_roll90
  4.     .globl        pcg_roll90
  5.     .globl        bgpcg_roll90
  6.  
  7.  
  8.     .include    doscall.mac
  9.     .include    iocscall.mac
  10.  
  11.  
  12.     .offset 0
  13.  
  14. par1_l    ds.b    2
  15. par1_w    ds.b    1
  16. par1_b    ds.b    1
  17.  
  18. par2_l    ds.b    2
  19. par2_w    ds.b    1
  20. par2_b    ds.b    1
  21.  
  22. par3_l    ds.b    2
  23. par3_w    ds.b    1
  24. par3_b    ds.b    1
  25.  
  26. par4_l    ds.b    2
  27. par4_w    ds.b    1
  28. par4_b    ds.b    1
  29.  
  30.  
  31.     .text
  32.     .even
  33.  
  34.  
  35. *■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■
  36. *
  37. *    書式:void    pcg_roll90( *pcg , lr ) ;
  38. *
  39. *      IN : a0.l = *pcg
  40. *           d0.l = lr
  41. *
  42. *      OUT: 無し
  43. *
  44. *    BREAK: 無し
  45. *
  46. *■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■
  47.  
  48. _pcg_roll90:
  49.  
  50. A7ID    =    4+9*4            *   スタック上 return先アドレス  [ 4 byte ]
  51.                     * + 退避レジスタの全バイト数     [ 9*4 byte ]
  52.  
  53.  
  54.     movea.l    4+par1_l(sp),a0        * a0.l = 回転するPCGのアドレス
  55.     move.l    4+par2_l(sp),d0        * d0.l = 回転方向
  56.                     * レジスタ退避前に読み出すのでオフセットに注意
  57.  
  58. *-------[ 初期化 ]
  59. pcg_roll90:
  60.     movem.l    d0-d3/d6-d7/a1-a3,-(sp)    * レジスタ退避
  61.  
  62.     lea.l    temp_pcg,a1        * a1.l = 生成したデータの一時書込み先
  63.  
  64.     tst.l    d0
  65.     bmi.b    L90
  66.     beq    EXIT
  67.  
  68.  
  69. *-------[ 右回転 ]
  70. R90:
  71.     lea.l    (a0),a2
  72.     lea.l    64(a1),a3
  73.     bsr    ROLL_R
  74.  
  75.     lea.l    32(a0),a2
  76.     lea.l    (a1),a3
  77.     bsr    ROLL_R
  78.  
  79.     lea.l    64(a0),a2
  80.     lea.l    96(a1),a3
  81.     bsr    ROLL_R
  82.  
  83.     lea.l    96(a0),a2
  84.     lea.l    32(a1),a3
  85.     bsr    ROLL_R
  86.  
  87.     bra.b    @F
  88.  
  89.  
  90. *-------[ 左回転 ]
  91. L90:
  92.     lea.l    (a0),a2
  93.     lea.l    32(a1),a3
  94.     bsr    ROLL_L
  95.  
  96.     lea.l    32(a0),a2
  97.     lea.l    96(a1),a3
  98.     bsr    ROLL_L
  99.  
  100.     lea.l    64(a0),a2
  101.     lea.l    (a1),a3
  102.     bsr    ROLL_L
  103.  
  104.     lea.l    96(a0),a2
  105.     lea.l    64(a1),a3
  106.     bsr    ROLL_L
  107.  
  108.  
  109. *-------[ 一時書込み先よりコピー ]
  110. @@:
  111.     movem.l    (a1)+,d0-d3/d6-d7/a2-a3
  112.     movem.l    d0-d3/d6-d7/a2-a3,(a0)
  113.     movem.l    (a1)+,d0-d3/d6-d7/a2-a3
  114.     movem.l    d0-d3/d6-d7/a2-a3,4*8(a0)
  115.     movem.l    (a1)+,d0-d3/d6-d7/a2-a3
  116.     movem.l    d0-d3/d6-d7/a2-a3,4*16(a0)
  117.     movem.l    (a1)+,d0-d3/d6-d7/a2-a3
  118.     movem.l    d0-d3/d6-d7/a2-a3,4*24(a0)
  119.  
  120.  
  121. *-------[ 終了 ]
  122. EXIT:
  123.     movem.l    (sp)+,d0-d3/d6-d7/a1-a3    * レジスタ復活
  124.     rts
  125.  
  126.  
  127.  
  128.  
  129. *■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■
  130. *
  131. *    書式:void    bgpcg_roll90( *pcg , lr ) ;
  132. *
  133. *      IN : a0.l = *pcg
  134. *           d0.l = lr
  135. *
  136. *      OUT: 無し
  137. *
  138. *    BREAK: 無し
  139. *
  140. *■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■
  141.  
  142. _bgpcg_roll90:
  143.  
  144. A7ID    =    4+9*4            *   スタック上 return先アドレス  [ 4 byte ]
  145.                     * + 退避レジスタの全バイト数     [ 9*4 byte ]
  146.  
  147.  
  148.     movea.l    4+par1_l(sp),a0        * a0.l = 回転するPCGのアドレス
  149.     move.l    4+par2_l(sp),d0        * d0.l = 回転方向
  150.                     * レジスタ退避前に読み出すのでオフセットに注意
  151.  
  152. *-------[ 初期化 ]
  153. bgpcg_roll90:
  154.     movem.l    d0-d3/d6-d7/a1-a3,-(sp)    * レジスタ退避
  155.  
  156.     lea.l    temp_pcg,a1        * a1.l = 生成したデータの一時書込み先
  157.     lea.l    (a0),a2
  158.     lea.l    (a1),a3
  159.  
  160.     tst.l    d0
  161.     bmi.b    BG_L90
  162.     beq.b    BG_EXIT
  163.  
  164.  
  165. *-------[ 右回転 ]
  166. BG_R90:
  167.     bsr    ROLL_R
  168.     bra.b    @F
  169.  
  170.  
  171. *-------[ 左回転 ]
  172. BG_L90:
  173.     bsr    ROLL_L
  174.  
  175.  
  176. *-------[ 一時書込み先よりコピー ]
  177. @@:
  178.     movem.l    (a1)+,d0-d3/d6-d7/a2-a3
  179.     movem.l    d0-d3/d6-d7/a2-a3,(a0)
  180.  
  181.  
  182. *-------[ 終了 ]
  183. BG_EXIT:
  184.     movem.l    (sp)+,d0-d3/d6-d7/a1-a3    * レジスタ復活
  185.     rts
  186.  
  187.  
  188.  
  189.  
  190. *■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■
  191. *
  192. *    8*8ドット範囲の右90度回転
  193. *
  194. *    引数:a2.l = 読出し元 矩形左上端アドレス
  195. *       a3.l = 書込み先 矩形左上端アドレス
  196. *
  197. *    破壊:d0-d3/d6-d7/a2-a3
  198. *
  199. *■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■
  200.  
  201. ROLL_R:
  202.     lea.l    3(a3),a3
  203.     moveq    #3,d7
  204.  
  205. ROLL_R_YLOOP:
  206.         moveq    #3,d6
  207.  
  208. ROLL_R_XLOOP:
  209.             move.b    (a2),d0        * d0.b = [0][1]
  210.             move.b    4(a2),d1    * d1.b = [2][3]
  211.  
  212.             move.b    d0,d2
  213.             lsr.b    #4,d2        * d2.b = [ ][0]
  214.             move.b    d1,d3
  215.             andi.b    #$F0,d3        * d3.b = [2][ ]
  216.             or.b    d3,d2        * d2.b = [2][0]
  217.  
  218.             andi.b    #$0F,d0        * d0.b = [ ][1]
  219.             lsl.b    #4,d1        * d1.b = [3][ ]
  220.             or.b    d1,d0        * d0.b = [3][1]
  221.  
  222.             move.b    d2,(a3)        * [2][0] 転送
  223.             move.b    d0,4(a3)    * [3][1] 転送
  224.  
  225.             lea.l    1(a2),a2
  226.             lea.l    8(a3),a3
  227.  
  228.         dbra    d6,ROLL_R_XLOOP
  229.  
  230.         lea.l    4(a2),a2
  231.         lea.l    -32-1(a3),a3
  232.  
  233.     dbra    d7,ROLL_R_YLOOP
  234.  
  235.     rts
  236.  
  237.  
  238.  
  239.  
  240. *■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■
  241. *
  242. *    8*8ドット範囲の左90度回転
  243. *
  244. *    引数:a2.l = 読出し元 矩形左上端アドレス
  245. *       a3.l = 書込み先 矩形左上端アドレス
  246. *
  247. *    破壊:d0-d3/d6-d7/a2-a3
  248. *
  249. *■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■
  250.  
  251. ROLL_L:
  252.     lea.l    24(a3),a3
  253.     moveq    #3,d7
  254.  
  255. ROLL_L_YLOOP:
  256.         moveq    #3,d6
  257.  
  258. ROLL_L_XLOOP:
  259.             move.b    (a2),d0        * d0.b = [0][1]
  260.             move.b    4(a2),d1    * d1.b = [2][3]
  261.  
  262.             move.b    d0,d2
  263.             lsl.b    #4,d2        * d2.b = [1][ ]
  264.             move.b    d1,d3
  265.             andi.b    #$0F,d3        * d3.b = [ ][3]
  266.             or.b    d3,d2        * d2.b = [1][3]
  267.  
  268.             andi.b    #$F0,d0        * d0.b = [0][ ]
  269.             lsr.b    #4,d1        * d1.b = [ ][2]
  270.             or.b    d1,d0        * d0.b = [0][2]
  271.  
  272.             move.b    d2,(a3)        * [1][3] 転送
  273.             move.b    d0,4(a3)    * [0][2] 転送
  274.  
  275.             lea.l    1(a2),a2
  276.             lea.l    -8(a3),a3
  277.  
  278.         dbra    d6,ROLL_L_XLOOP
  279.  
  280.         lea.l    4(a2),a2
  281.         lea.l    32+1(a3),a3
  282.  
  283.     dbra    d7,ROLL_L_YLOOP
  284.  
  285.     rts
  286.  
  287.  
  288.  
  289.  
  290. *■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■
  291. *
  292. *    メモリ確保
  293. *
  294. *■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■
  295.  
  296.     .bss
  297.     .even
  298.  
  299. temp_pcg:    ds.b    128
  300.  
  301.  
  302.